package com.fy.tt.action;


/**
 * <p>
 * 帮语词汇表 前端控制器
 * </p>
 *
 * @author xiaoliang
 * @since 2021-06-30
 */

import com.fy.basejar.tool.ActionToolBase;
import com.fy.toolhelper.util.ResponseUtils;
import com.fy.tt.dao.WordDao;
import com.fy.tt.dao.impl.WordDaoImpl;
import com.fy.tt.service.WordService;
import com.fy.tt.service.impl.WordServiceImpl;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**  swagger注解使用
 @Api()
 用于类；表示标识这个类是swagger的资源
 tags–表示说明
 value–也是说明，可以使用tags替代
 但是tags如果有多个值，会生成多个list
 @ApiOperation() 用于方法；表示一个http请求的操作
 value用于方法描述
 notes用于提示内容
 tags可以重新分组（视情况而用）
 @ApiParam() 用于方法，参数，字段说明；表示对参数的添加元数据（说明或是否必填等）
 name–参数名
 value–参数说明
 required–是否必填
  * */

//@Api(value="词汇管理接口")
//@RestController
//@RequestMapping("/word")
public class WordController extends ActionToolBase {


    /*
     * 查询所有汇信息
     * */
//    @ApiOperation(value="查询所有词汇")
//    @GetMapping("/word")
//    public R findAllWord(){
//        List<Word> wordList = wordService.list(null);
//        return R.ok().put("list",wordList);
//    }
    @Action
    public Map<String,Object> getAllWords(HttpServletRequest request) throws Exception{
        return ResponseUtils.asResultAndMsg("data","msg");
    }

    /*
     * 分页多条件查询
     * */
    //@RequestBody 一定要使用post请求
//    @ApiOperation(value="多条件分页查询词汇")
//    @PostMapping("pageWordCondition/{current}/{limit}")
//    public R pageQuery(@ApiParam(name="current",value="当前页",required=true) @PathVariable("current") long current,
//                       @ApiParam(name="limit",value="每页页数",required=true) @PathVariable("limit") long limit,
//                       @ApiParam(name="wordQuery",value = "word查询条件封装对象",required = false) @RequestBody(required = false) WordQuery wordQuery){
//
//        Page<Word> page = wordService.pageWordCondition(current,limit,wordQuery);
//
//        List<Word> wordList = page.getRecords();
//        long total = page.getTotal();
//
//        return R.ok().put("total",total).put("rows",wordList);
//    }

    /*
     * 删除word(根据id)
     * */
//    @ApiOperation(value="删除词汇")
    //使用该注解标志的方法，会清空指定的缓存。一般用在更新或者删除方法上
//    @CacheEvict(value = "index",key = "'wordList'")
//    @DeleteMapping("word/{id}")
//    public R deleteWordById(@ApiParam(name="id",value="词汇id",required=true) @PathVariable("id") String id){
//        /*
//         * 目前删除逻辑是，如果所传的id不存在，或者当前id本来就已经删除，或者正确删除，都是返回true
//         * */
//        boolean result = wordService.removeById(id);
//        System.out.println("result = " + result);
//        if (result){
//            return R.ok();
//        }else {
//            return R.error();
//        }
//    }

    /*
     * 添加词汇
     * */
    //使用该注解标志的方法，会清空指定的缓存。一般用在更新或者删除方法上
//    @CacheEvict(value = "index",key = "'wordList'")
//    @ApiOperation(value = "新增词汇")
//    @PostMapping("word")
//    public R addWord(@ApiParam(name = "word", value = "词汇对象", required = true)
//                        @RequestBody(required = true) Word word){
//
//        boolean result = wordService.save(word);
//        if (result){
//            return R.ok();
//        }else {
//            return R.error();
//        }
//    }

    /*
     * 根据id查询词汇
     * */
//    @ApiOperation(value = "根据id查询词汇")
//    @GetMapping("word/{id}")
//    public R getWordById(@ApiParam(name = "id", value = "id", required = true)
//                            @PathVariable("id") String id){
//        Word word = wordService.getById(id);
//        return R.ok().put("data",word);
//    }

    /*
     * 根据id修改词汇
     * */
    //使用该注解标志的方法，会清空指定的缓存。一般用在更新或者删除方法上
//    @CacheEvict(value = "index",key = "'wordList'")
//    @ApiOperation(value = "根据id修改词汇")
//    @PutMapping("word")
//    public R updateWord(@ApiParam(name = "word", value = "词汇对象", required = true)
//                           @RequestBody(required = true) Word word){
//        boolean result = wordService.updateById(word);
//        if (result){
//            return R.ok();
//        }else {
//            return R.error();
//        }
//    }



    /* 这里是模拟Spring管理Bean提供的类实例管理的声明部分(没有依赖注入的处理, 所以不要把要用到的Bean声明为类成员变量)
     * 所有用到的Bean都要声明, 否则报错, 并且强烈建议forClass为接口, 注意保持声明方法的返回值类型与forClass一致*/

    @BeanDeclare(forClass = WordService.class, scope = BeanScope.TEMPORY)
    private WordService onDeclaringWordService() {
        // 这样做的好处是保留开发者自定义初始化的编程能力, 当然简单实例化情况下这样写也挺麻烦的
        return new WordServiceImpl();
    }

    @BeanDeclare(forClass = WordDao.class, scope = BeanScope.TEMPORY)
    private WordDao onDeclaringWordDao() throws Exception {
        return new WordDaoImpl();
    }

}

